#ifndef AVALON_HTTPSTATUSCODE_HPP
#define AVALON_HTTPSTATUSCODE_HPP
#include <string>
#include "Avalon/Base/Enumerator.hpp"
#include "Avalon/WebServices/WebServices.hpp"

namespace Avalon {
namespace WebServices {
namespace Details {
  struct HttpStatusCodeDefinition {
    enum Type {
      CONTINUE = 100,
      SWITCHING_PROTOCOLS = 101,
      PROCESSING = 102,
      OK = 200,
      CREATED = 201,
      ACCEPTED = 202,
      NON_AUTHORITATIVE_INFORMATION = 203,
      NO_CONTENT = 204,
      RESET_CONTENT = 205,
      PARTIAL_CONTENT = 206,
      MULTI_STATUS = 207,
      MULTIPLE_CHOICES = 300,
      MOVED_PERMANENTLY = 301,
      FOUND = 302,
      SEE_OTHER = 303,
      NOT_MODIFIED = 304,
      USE_PROXY = 305,
      SWITCH_PROXY = 306,
      TEMPORARY_REDIRECT = 307,
      BAD_REQUEST = 400,
      UNAUTHORIZED = 401,
      PAYMENT_REQUIRED = 402,
      FORBIDDEN = 403,
      NOT_FOUND = 404,
      METHOD_NOT_ALLOWED = 405,
      NOT_ACCEPTABLE = 406,
      PROXY_AUTHENTICATION_REQUIRED = 407,
      REQUEST_TIMEOUT = 408,
      CONFLICT = 409,
      GONE = 410,
      LENGTH_REQUIRED = 411,
      PRECONDITION_FAILED = 412,
      REQUEST_ENTITY_TOO_LARGE = 413,
      REQUEST_URI_TOO_LONG = 414,
      UNSUPPORTED_MEDIA_TYPE = 415,
      REQUESTED_RANGE_NOT_SATISFIABLE = 416,
      EXPECTATION_FAILED = 417,
      IM_A_TEAPOT = 418,
      UNPROCESSABLE_ENTITY = 422,
      LOCKED = 423,
      FAILED_DEPENDENCY = 424,
      UNORDERED_COLLECTION = 425,
      UPGRADE_REQUIRED = 426,
      NO_RESPONSE = 444,
      RETRY_WITH = 449,
      BLOCK_BY_WINDOWS_PARENTAL_CONTROLS = 450,
      CLIENT_CLOSED_REQUEST = 499,
      INTERNAL_SERVER_ERROR = 500,
      NOT_IMPLEMENTED = 501,
      BAD_GATEWAY = 502,
      SERVICE_UNAVAILABLE = 503,
      GATEWAY_TIMEOUT = 504,
      HTTP_VERSION_NOT_SUPPORTED = 505,
      VARIANT_ALSO_NEGOTIATES = 506,
      INSUFFICIENT_STORAGE = 507,
      BANDWIDTH_LIMIT_EXCEEDED = 509,
      NOT_EXTENDED = 510
    };

    const std::string& GetReasonPhrase() const;
  };
}

  /*! \struct HttpStatusCode
   *  \brief Enumerates HTTP status codes.
   */
  typedef Enumerator<Details::HttpStatusCodeDefinition> HttpStatusCode;
}
}

#endif // AVALON_HTTPSTATUSCODE_HPP
